package it.gat.client.view;

import it.gat.controller.UtenteController;
import it.gat.controller.utils.GatSession;
import it.gat.model.Cliente;
import it.gat.model.PermessoEnum;
import it.gat.model.Operatore;
import it.gat.model.Utente;

import java.awt.BorderLayout;

import javax.swing.AbstractButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

import java.awt.Frame;

import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JMenu;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JDesktopPane;

import java.awt.SystemColor;

public class MainFrame extends JFrame {

	private JPanel contentPane;
	private UtenteController uc;
	private JFrame mainFrame = this;
	private JMenuItem mntmLogout;
	private JMenuItem mntmLogin;
	private JMenuBar menuBar;
	private JMenu mnAnagrafiche;
	private JMenu mnAssistenza;
	private JMenuItem mntmArticoli;
	private JMenuItem mntmClienti;
	private JDesktopPane desktopPane;
	private JMenuItem mntmTicket;
	private JMenuItem mntmContratti;
	private JMenuItem mntmRapporti;
	private JMenuItem mntmTipologieDispositivi;
	private JMenuItem mntmAssegnaTicket;
	private JMenu mnCalendario;
	private JMenuItem mntmAppuntamenti;
	private JMenu mnAmministrazione;
	private JMenuItem mntmUtenti;
	private JMenuItem mntmImpostazioni;
	private AbstractButton mntmCambioPassword;


	/**
	 * Create the frame.
	 */
	public MainFrame() {
		setTitle("Gestione Assistenza Tecnica - Utente non loggato");
		setExtendedState(Frame.MAXIMIZED_BOTH);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);

		menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		creaLogin();

		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);

		desktopPane = new JDesktopPane();
		desktopPane.setBackground(SystemColor.control);
		contentPane.add(desktopPane, BorderLayout.CENTER);

	}

	private void creaMenu()
	{
		Utente utente = GatSession.getInstance().getUtenteLoggato();
		if ((utente.hasPermesso(PermessoEnum.ANAGRAFICAARTICOLI))||
				(utente.hasPermesso(PermessoEnum.ANAGRAFICACLIENTI))||
				(utente.hasPermesso(PermessoEnum.TIPOLOGIEDISPOSITIVI)))
		{
			mnAnagrafiche = new JMenu("Anagrafiche");
			menuBar.add(mnAnagrafiche);

			if (utente.hasPermesso(PermessoEnum.ANAGRAFICAARTICOLI))
			{
				mntmArticoli = new JMenuItem("Articoli");
				mnAnagrafiche.add(mntmArticoli);
				mntmArticoli.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						ArticoliInternalFrame articoliInternalFrame = new ArticoliInternalFrame("Anagrafica Articoli",desktopPane);
						desktopPane.add(articoliInternalFrame);
						mntmArticoli.setSelected(true);
						articoliInternalFrame.setVisible(true);
						articoliInternalFrame.toFront();
					}});
			}

			if (utente.hasPermesso(PermessoEnum.ANAGRAFICACLIENTI))
			{
				mntmClienti = new JMenuItem("Clienti");
				mnAnagrafiche.add(mntmClienti);
				mntmClienti.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						ClientiInternalFrame clientiInternalFrame = new ClientiInternalFrame("Anagrafica Clienti",desktopPane);
						desktopPane.add(clientiInternalFrame);
						clientiInternalFrame.setVisible(true);
						clientiInternalFrame.toFront();
					}});
			}
		}

		if (utente.hasPermesso(PermessoEnum.TIPOLOGIEDISPOSITIVI))
		{
			mntmTipologieDispositivi = new JMenuItem("Tipologie Dispositivi");
			mnAnagrafiche.add(mntmTipologieDispositivi);
			mntmTipologieDispositivi.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					TipologieDispositivoInternalFrame tipologieDispositivoInternalFrame = new TipologieDispositivoInternalFrame("Tipologie Dispositivi",desktopPane);
					desktopPane.add(tipologieDispositivoInternalFrame);
					tipologieDispositivoInternalFrame.setVisible(true);
					tipologieDispositivoInternalFrame.toFront();
				}});
		}

		if ((utente.hasPermesso(PermessoEnum.TICKET))||
				(utente.hasPermesso(PermessoEnum.ASSEGNATICKET))||
				(utente.hasPermesso(PermessoEnum.GESTIONECONTRATTI))||
				(utente.hasPermesso(PermessoEnum.RAPPORTIINTERVENTO)))
		{
			mnAssistenza = new JMenu("Assistenza");
			menuBar.add(mnAssistenza);

			if (utente.hasPermesso(PermessoEnum.TICKET))
			{
				mntmTicket = new JMenuItem("Ticket");
				mnAssistenza.add(mntmTicket);
				mntmTicket.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						TicketsInternalFrame ticketsInternalFrame = new TicketsInternalFrame("Tickets",desktopPane);
						desktopPane.add(ticketsInternalFrame);
						ticketsInternalFrame.setVisible(true);
						ticketsInternalFrame.toFront();
					}});
			}

			if (utente.hasPermesso(PermessoEnum.ASSEGNATICKET))
			{
				mntmAssegnaTicket = new JMenuItem("Assegna Ticket");
				mnAssistenza.add(mntmAssegnaTicket);
				mntmAssegnaTicket.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						TicketsAssegnaInternalFrame ticketsInternalFrame = new TicketsAssegnaInternalFrame("Assegna Ticket",desktopPane);
						desktopPane.add(ticketsInternalFrame);
						ticketsInternalFrame.setVisible(true);
						ticketsInternalFrame.toFront();
					}});
			}

			if (utente.hasPermesso(PermessoEnum.GESTIONECONTRATTI))
			{
				mntmContratti = new JMenuItem("Contratti");
				mnAssistenza.add(mntmContratti);
				mntmContratti.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						ContrattiInternalFrame contrattiInternalFrame = new ContrattiInternalFrame("Contratti",desktopPane);
						desktopPane.add(contrattiInternalFrame);
						contrattiInternalFrame.setVisible(true);
						contrattiInternalFrame.toFront();
					}});
			}

			if (utente.hasPermesso(PermessoEnum.RAPPORTIINTERVENTO))
			{
				mntmRapporti = new JMenuItem("Rapporti di intervento");
				mnAssistenza.add(mntmRapporti);
				mntmRapporti.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						RapportiInterventoInternalFrame rapportiInterventoInternalFrame = new RapportiInterventoInternalFrame("Rapporti Intervento",desktopPane);
						desktopPane.add(rapportiInterventoInternalFrame);
						rapportiInterventoInternalFrame.setVisible(true);
						rapportiInterventoInternalFrame.toFront();
					}});
			}
		}

		if (utente.hasPermesso(PermessoEnum.CALENDARIO))
		{
			mnCalendario = new JMenu("Calendario");
			menuBar.add(mnCalendario);

			mntmAppuntamenti = new JMenuItem("Appuntamenti");
			mnCalendario.add(mntmAppuntamenti);
			mntmAppuntamenti.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					UtenteController uc = new UtenteController();
					Operatore tecnico = uc.getOperatoreByNomeUtente(GatSession.getInstance().getNomeUtente());
					AppuntamentiTecnicoSelectionFrame appuntamentiTecnicoSelectionFrame = new AppuntamentiTecnicoSelectionFrame("Appuntamenti",desktopPane,tecnico);
					desktopPane.add(appuntamentiTecnicoSelectionFrame);
					appuntamentiTecnicoSelectionFrame.setVisible(true);
					appuntamentiTecnicoSelectionFrame.toFront();
				}});
		}

		if (utente.hasPermesso(PermessoEnum.UTENTI))
		{
			mnAmministrazione = new JMenu("Amministrazione");
			menuBar.add(mnAmministrazione);

			mntmUtenti = new JMenuItem("Utenti");
			mnAmministrazione.add(mntmUtenti);
			mntmUtenti.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					UtentiInternalFrame utentiInternalFrame = new UtentiInternalFrame("Utenti",desktopPane);
					desktopPane.add(utentiInternalFrame);
					utentiInternalFrame.setVisible(true);
					utentiInternalFrame.toFront();
				}});
		}

		SwingUtilities.updateComponentTreeUI(menuBar);
	}
	
	private void distruggiMenu()
	{
		menuBar.removeAll();
		creaLogin();
		SwingUtilities.updateComponentTreeUI(menuBar);
	}
	
	private void creaLogin()
	{
		JMenu mnFile = new JMenu("File");
		menuBar.add(mnFile);

		mntmLogin = new JMenuItem("Login");
		mntmLogin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try
				{
					uc = new UtenteController();
					LoginDialog loginDialog = new LoginDialog(uc,mainFrame);
					loginDialog.setVisible(true);
					if (uc.login(GatSession.getInstance().getNomeUtente(),GatSession.getInstance().getPassword()))
					{
						String title="Utente loggato: ";
						if (GatSession.getInstance().getUtenteLoggato().getNome()!=null)
							title+=GatSession.getInstance().getUtenteLoggato().getNome()+" ";
						if (GatSession.getInstance().getUtenteLoggato().getCognome()!=null)
							title+=GatSession.getInstance().getUtenteLoggato().getCognome()+" ";
						if (GatSession.getInstance().getUtenteLoggato() instanceof Cliente)
							title+=((Cliente)GatSession.getInstance().getUtenteLoggato()).getRagioneSociale()+" ";
						mainFrame.setTitle("Gestione Assistenza Tecnica - " + title);
						System.out.println("Utente loggato");
						creaMenu();
						mntmLogin.setEnabled(false);
						mntmLogout.setEnabled(true);
						mntmCambioPassword.setEnabled(true);
					}
					else
					{
						JOptionPane.showMessageDialog(null,"Nome utente e/o password errati","Errore Login",JOptionPane.ERROR_MESSAGE);
					}
				}
				catch (Exception ex)
				{
					JOptionPane.showMessageDialog(null,"Nome utente e/o password errati","Errore Login",JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		mnFile.add(mntmLogin);

		mntmLogout = new JMenuItem("Logout");
		mntmLogout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				GatSession.getInstance().setUtenteLoggato(null);
				setTitle("Gestione Assistenza Tecnica - Utente non loggato");
				mntmLogin.setEnabled(true);
				mntmLogout.setEnabled(false);
				mntmCambioPassword.setEnabled(false);
				distruggiMenu();
				desktopPane.removeAll();
				desktopPane.repaint();
			}
		});
		mntmLogout.setEnabled(false);
		mnFile.add(mntmLogout);


		mnFile.addSeparator();
		
		mntmImpostazioni = new JMenuItem("Impostazioni");
		mntmImpostazioni.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ImpostazioniDialog il = new ImpostazioniDialog();
				il.setVisible(true);
			}
		});
		mntmImpostazioni.setEnabled(true);
		mnFile.add(mntmImpostazioni);
		
		mntmCambioPassword = new JMenuItem("Cambio Password");
		mntmCambioPassword.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				PasswordDialog pd = new PasswordDialog();
				pd.setVisible(true);
			}
		});
		mntmCambioPassword.setEnabled(false);
		mnFile.add(mntmCambioPassword);
		
		mnFile.addSeparator();

		JMenuItem mntmEsci = new JMenuItem("Esci");
		mntmEsci.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		mnFile.add(mntmEsci);
	}
}
